import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")

import django

django.setup()
from app01 import models

# 聚合和分组
from django.db.models import Max, Min, Count, Sum, Avg

# 聚合 aggregrate 终止子句（将符合条件的数据筛选出来，放在一起。格式为键值对的形式。筛选条件：内容）
ret = models.Book.objects.filter(id__gt=2).aggregate(max=Max('price'), min=Min('price'))
# 运行结果:{'max': Decimal('100.00'), 'min': Decimal('20.00')}

# 分组 group by

# annotate 注释 过程中使用了分组
# 统计每本书作者的个数（按照书分组）
ret = models.Book.objects.annotate(Count('authors')).values()  # 添加额外的信息
# for i in ret:
#     print(i)
# 结果：{'id': 1, 'name': '英汉字典', 'pub_id': 2, 'price': Decimal('999.00'), 'author__count': 0}

# 统计每个出版社卖的卖的最便宜的书的价格(按照出版社分组)
# 方法一
ret = models.Publisher.objects.annotate(Min('books__price')).values()  # 双下划线反向跨表
# for i in ret:
#     print(i)
# 结果多行{'id': 11, 'name': '工业出版社', 'books__price__min': Decimal('50.00')

# 方法二
# 按照pub 或者按照pub__name来进行分组
ret = models.Book.objects.values('pub_id', 'pub__name').annotate(Min('price'))  # annotate前为要分组的对象
# for i in ret:
#     print(i)
# 结果 {'pub_id': 1, 'pub__name': '商务印书馆', 'price__min': Decimal('20.00')}

# 统计不止一个作者的书(分组的实质，将分组的内容虚拟添加到一列在最后，其余操作按照表单即可)
ret = models.Book.objects.annotate(count=Count("authors")).filter(count__gt=1)
# for i in ret:
#     print(i)

# 根据一本书作者数量的多少对查询集QuerySet进行排序
ret = models.Book.objects.annotate(count=Count('authors')).order_by('count').values()
# for i in ret:
#     print(i)

# 查询各个作者出的书的总价格
ret = models.Author.objects.annotate(sum=Sum('books__price')).values()

ret = models.Book.objects.values('authors', 'authors__name').annotate(sum=Sum('price'))
for i in ret:
    print(i)
